package com.hyper_yang._05_juc.chap07;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;

public class BlockingQueueDemo {

    public static void main(String[] args) throws InterruptedException {

        //创建有界阻塞队列
        //BlockingQueue<String> queue = new ArrayBlockingQueue<>(3); //有界阻塞队列   长度 capacity   1 ~ Integer.MAX_VALUE
        BlockingQueue<String> queue = new LinkedBlockingDeque<>(); //无界阻塞队列  但是其实也是有界，1 ~  最大值Integer.MAX_VALUE

        // 第一组方法：add remove element
        /*System.out.println(queue.add("a")); //入队  成功  true
        System.out.println(queue.add("b")); //入队  成功  true
        System.out.println(queue.add("c")); //入队  成功  true

        //System.out.println(queue.add("d")); // 队列满了，仍然入队就会抛 java.lang.IllegalStateException
        System.out.println(queue.element());  // 队列特点 先进先出  查看队首元素
        System.out.println(queue.element());  // 队列特点 先进先出  查看队首元素
        System.out.println(queue.element());  // 队列特点 先进先出  查看队首元素
        System.out.println(queue.remove());  //出队(删除)   先进先出
        //System.out.println(queue.remove());  //出队(删除)   先进先出
        //System.out.println(queue.remove());  //出队(删除)   先进先出
        //System.out.println(queue.remove()); //空队列进行删除  java.util.NoSuchElementException
        System.out.println(queue.element());*/


        // 第二组：offer poll peek
        /*System.out.println(queue.offer("a")); //true
        System.out.println(queue.offer("b")); //true
        System.out.println(queue.offer("c")); //true
        System.out.println(queue.offer("d")); //false
        System.out.println(queue.peek());
        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll()); //队列空，返回null
        System.out.println(queue.peek());*/

        // 第三组：put take
        //阻塞情况： 队列满了不能放     队列空了不能取
        /*queue.put("a"); //入队
        queue.put("b");
        queue.put("c");
        //System.out.println(queue.take());
        queue.put("d");  //队列满了不能放 被阻塞
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take()); //队列空被阻塞*/

        // 第四组：offer poll
        System.out.println(queue.offer("a")); //true
        System.out.println(queue.offer("b")); //true
        System.out.println(queue.offer("c")); //true
        System.out.println(queue.offer("d", 5, TimeUnit.SECONDS)); //false 队列满了放不下，被阻塞指定时间长度。到时间后还放不进行就放弃。
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll(5, TimeUnit.SECONDS)); //队列空了不能取，被阻塞。等待指定时间长度。时间到了还是空返回null走人。
    }
}